package cn.topcodes.tcsf.admin.service.org;

import cn.topcodes.tcsf.admin.commons.domain.Page;
import cn.topcodes.tcsf.admin.commons.generic.IGenericService;
import cn.topcodes.tcsf.admin.commons.generic.IUserService;
import cn.topcodes.tcsf.admin.domain.entity.SysRole;
import cn.topcodes.tcsf.admin.domain.entity.SysUser;
import cn.topcodes.tcsf.admin.domain.form.UpdateSysUserForm;
import tk.mybatis.mapper.entity.Example;

import java.util.List;
import java.util.Map;

/**
 * 系统用户管理服务接口
 * @author Leo
 */
public interface SysUserService extends IGenericService<SysUser>, IUserService {
	
	/*密码Hash校验算法*/
	public static final String HASH_ALGORITHM = "SHA-1";
	/*迭代次数*/
	public static final int HASH_INTERATIONS = 1024;
	/*Salt长度*/
	public static final int SALT_SIZE = 8;
	
	/**
	 * 根据用户ID判断用户是否在线
	 * @param userId		用户ID
	 * @return				True:在线,False:离线
	 */
	public boolean isOnline(long userId);
	
	/**
	 * 条件查找所有在线用户
	 * @param example		条件
	 * @return				列表数据
	 */
	public List<SysUser> findAllOnline(Example example);

	/**
	 * 根据名称查找用户列表
	 * @param name
	 * @return
	 */
	public List<SysUser> findAll(Long curUserId, String name);
	
	/**
	 * 条件查找所有在线用户
	 * @param searchParams	条件
	 * @return				列表数据
	 */
	public List<SysUser> findAllOnline(Map<String,String> searchParams);
	
	/**
	 * 分页条件查找所有在线用户
	 * @param example		条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	public Page<SysUser> findPageOnline(Example example, int pageNumber, int pageSize);
	
	/**
	 * 分页条件查找所有在线用户
	 * @param searchParams	条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	public Page<SysUser> findPageOnline(Map<String,String> searchParams, int pageNumber, int pageSize);
	
	/**
	 * 强制用户下线
	 * @param userId	用户ID
	 */
	public void forcedOffline(long userId);

	/**
	 * 通过用户名查找用户信息
	 * @param username	用户名
	 * @return	用户对象
	 */
	public SysUser findByUsername(String username);
	
	/**
	 * 判断密码是否相同
	 * @param plainPwd	明文密码
	 * @param user	用户
	 * @return	
	 */
	public boolean isPwdEqual(String plainPwd, SysUser user);
	
	/**
	 * 用户注册
	 * @param user	用户信息
	 * @param ip	注册客户端IP
	 */
	public void register(SysUser user, Long roleId, String ip);

	/**
	 * 设置用户的角色
	 * @param userId	用户ID
	 * @param roleId	角色ID
	 */
	public void setRole(Long userId, Long roleId);

	/**
	 * 更新用户信息
	 * @param form
	 */
	public void update(UpdateSysUserForm form);

	/**
	 * 用户登录
	 * @param username
	 * @param password
	 * @param rememberMe
	 */
	public void login(String username, String password, Boolean rememberMe, String ip);
	
	/**
	 * 用户登出
	 */
	public void logout();
	
	/**
	 * 修改密码
	 * @param userId	修改密码目标用户
	 * @param orginalPassword	原密码
	 * @param newPassword	新密码
	 */
	public void modifyPassword(long userId, String orginalPassword, String newPassword);

	/**
	 * 获取用户的角色ID
	 * @param id
	 * @return
	 */
	SysRole getRole(Long id);

	/**
	 * 重置密码
	 * @param id
	 * @param newPassword
	 */
	void resetPassword(Long id, String newPassword);
}
